package com.errol.generic.file.excel.pojo;

import com.renjia.service.generic.file.excel.service.ExcelService;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Created by Errol1017 on 2018/6/13.
 * excel 映射类注解，用于定义 {@link ExcelService} 接口使用的 clazz
 * 被该注解定义的类需符合 java bean 规范
 *
 * @author zhang xiao bin
 * @version v1.0
 * @date 2020/10/21
 * @since v4.7.6
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelConfig {

    /**
     * 生成 excel 时使用的文件名称，文件名称需包含后缀；如为 "" 则使用随机码作文件名，并生成 .xlsx 文件
     */
    String filename() default "";

    /**
     * excel sheet 中的标题，显示在 sheet 第一行；读取 excel 时将检查 sheet 第一行是否应该有 title ，但不会检查 title 的内容
     */
    String title() default "";

    /**
     * 映射策略，默认为 {@link MappingPolicy#ORDER}
     */
    MappingPolicy mappingPolicy() default MappingPolicy.ORDER;

    /**
     * 是否去除单元格内容中的占位符以及首尾的空格符，包括 \n 回车(\u000a) \t 水平制表符(\u0009) \s 空格(\u0008) \r 换行(\u000d)
     */
    boolean trim() default true;

    /**
     * 类 filed 与 excel 行之间的映射策略
     */
    enum MappingPolicy {
        /**
         * 按类中使用 {@link ExcelColConfig#order()} 注解定义的 order() 从小到大逐次映射到 excel 的列
         * 解析 excel 时只需保证列的顺序与 order 的排序一致
         * 写入 excel 时只用该策略
         */
        ORDER,
        /**
         * 按类中使用 {@link ExcelColConfig} 注解定义的 field 进行映射
         * 解析 excel 时只需保证各列的表头与 field 字段名一致，无关列的顺序
         */
        FIELD,
        /**
         * 按类中使用 {@link ExcelColConfig#title()} 注解定义的 title() 进行映射
         * 解析 excel 时只需保证各列的表头与 title() 名称一致，无关列的顺序
         */
        TITLE
    }
}
